1

基础定义

TCP/IP体系结构(4层)

应用层 (应用层,表示层,会话层)

协议:
HTTP - 提供Internet浏览服务
SMTP - 简单的电子邮件发送服务
DNS - 负责域名和IP地址的映射
POP / IMAP - 对邮箱服务器进行远程存取邮件的服务(POP-服务端传给客户端后删除、状态不同步;IMAP-服务端存、状态同步)
FTP - 应用级文件传输服务
Telnet - 远程登录服务(明文传输)
SSH - 远程登录服务(加密)
定义应用进程间通信、交互的规则。(主机中运行的程序、基于CS方式、报文)

运输层

协议:
TCP - 面向连接、可靠的报文服务
UDP - 无连接、不可靠的报文服务
为不同主机中的进程间提供通信服务。传输单位:报文段(TCP)、用户数据报文(UDP)
功能:
为端到端的连接提供传输服务。

网络层

协议:
IP - 提供网络节点之间的报文传送服务
ARP - 实现IP地址向物理地址的映射【ARP攻击】
RARP - 实现物理地址向IP地址的映射
ICMP - 探测、报告传输中产生的错误
IGMP - 管理多播组测成员关系
其余:IPX、OSPF
为不同主机提供通信服务:网络层的分组数据从源端到目的端。传输单位:数据报。
功能:
  1. 封装数据成分组/包、路由选择
  2. 流量控制、拥塞控制、差错控制、网际互联

网络接口层(链路层、物理层)

协议:STP
负责数据传输工作。传输单位:帧
功能:
  1. 组帧、差错控制、流量控制和传输管理
  2. 在广播式网络通过介质访问子层,控制共享信道的访问

TCP与UDP

TCP协议 (Transmission Control Protocol,传输控制协议)

面向连接、面向字节流、全双工通信、可靠。
属于传输层通信协议,基于TCP的应用层协议有 HTTP SMTP FTP Telnet POP3。
缺点:效率慢(建立连接、发送确认包)

传送的数据单元:报文段。

报文段 = 首部 + 数据
首部 = 20字节 + 4n个根据需要增加的选项 (最小长度 20 字节)
//共 5 行,每行4字节
源端口  目的端口
序号
确认号
数据偏移  保留  URG ACK PSH RST SYN FIN  窗口
校验和  紧急指针

序号 - 报文段序号
确认号 - (ACK)期望收到对方下一个报文的序号。ACK=N,表示序号N-1的所有数据都已正确收到
SYN - 同步位,连接建立时用于同步序号
FIN - 终止控制位,释放连接

TCP建立连接 - 三次握手

C -> S - SYN=1,seq=x
C <- S - SYN=1,ACK=1,seq=y,ack=x+1
C -> S - ACK=1,seq=x+1,ack=y+1

作用:防止接受早已失效的连接请求报文,造成死锁、浪费资源

TCP释放连接 - 四次挥手

C -> S - FIN=1,seq=u
C <- S - ACK=1,seq=v,ack=u+1
     CLOSE_WAIT //通知上层关闭
C <- S - FIN=1,ACK=1,seq=w,ack=u+1
C -> S - ACK=1,seq=u+1,ack=w+1
TIME_WAIT (2MSL)

无差错控制原理

基础:

发送窗口

任意时刻,发送方维持的一组连续的、允许发送帧的帧序号(对发送方的进行流量控制)
工作原理:1. 每收到一个确认帧,发送窗口向前滑动一个帧的距离;2. 无可发送帧时,停止发送,等待确认帧。有确认帧且窗口向前滑动时,才继续发送。

接受窗口

任意时刻,接收方维持的一组连续的、允许接受帧的帧序号(控制可接受、不可接受哪些数据帧,只有收到的帧序号在窗口内才允许收下)
工作原理:收到数据帧后,窗口向前移动一个位置,并发回确认帧。若收到窗口之外的,一律丢弃。

协议

停止-等待协议、后退N帧协议、选择重传协议只是在发送窗口大小和接收窗口大小上有所差别

停止-等待协议:发送窗口大小 = 1,接收窗口大小 = 1
后退N帧协议:发送窗口大小 > 1, 接收窗口 = 1
选择重传协议:发送窗口大小 > 1,接收窗口 > 1

实现无差错传输的解决方案

采用可靠传输协议,使得 1.出错重传,出现差错时,让发送方重传差错数据;2.速度匹配,当接收方来不及接收可通知发送方降低速率。

自动重传请求协议ARQ(Auto Repeat reQuest) (针对 出错重传)
传输出现差错时,接收方自动请求发送方重传出错的数据。
机制:1.确认机制 - 发送方收到应答才发送,接收方收到一个反馈一个,不反馈发送方一直等待;2.超时重传机制 - 发送方发送后开启计时器,一定时间内每收到确认,则重发,直到成功为止。
类型:停止等待式ARQ、后退N帧ARQ、选择重传ARQ。

流量控制 & 拥塞控制 (针对 速度匹配)
接收方根据自己接收缓存的大小,动态调整发送方的发送窗口大小。
避免发送太快,接收方来不及。

相关资料:
TCP协议攻略

UDP协议 (User Dataram Protocal, 用户数据报协议)

属于传输层通信协议
基于UDP的应用层协议有 TFTP(文件传输)、SNMP(网络管理)、NFS(远程文件服务器) 与 DNS(域名转换)

无连接的、不可靠的、面向报文、无拥塞协议

不需要建立连接,发送后不管是否会到达
以数据报文(包)的形式传输,UDP数据报文长度无限制,一次性发送,不拆分

报文段格式

UDP的报文段共有2个字段:数据字段 + 首部字段(8字节,4个字段)

UDP首部:
源端口 - 源端口号,需要 对方回信时使用
目的端口 - 终点交付报文时需使用到
长度 - UDP用户数据报的长度
检验和 - 检测在传输中是否有错,有错丢弃

HTTP (HyperText Transfer Protocol, 超文本传输协议)

属于应用层。规定了应用进程间通信的准则。

特点:
传输效率高 - 无连接、无状态、传输格式简单
传输可靠性高 - 采用TCP作为传输层协议

请求方法

不同的方法规定了不同的操作指定的资源的方式。服务端会根据不同的请求方法做不同的响应。

若服务器时 RESTful 接口,一般会用到 GET、POST、DELETE、PUT
  • GET

显示请求指定资源。只用于数据的读取。

传递参数长度受限制,只允许ASCII字符,安全性差(可见)
应用场景:小量、数据不敏感,从指定资源请求数据

  • POST

向指定资源提交数据,请求数据处理。表单数据提交、文件上传。

传递参数长度不受限制,可传递任何类型字符,安全性好
应用场景:大量、数据敏感,想指定资源提交数据

  • HEAD

向服务器发出指定资源的请求,服务器在响应是不会回传响应主体(内容)。

可以在不传输全部内容的情况下,获取服务器的响应头信息。常用于客户端查看服务端性能。【请求完整执行?】

  • PUT (以下 1.1新增)

向指定资源位置上传其最新内容,取代指定的资源(已存在)的内容。

  • PATCH

当资源不存在时会创建新资源。部分更新。

  • DELETE

请求服务器删除所请求的URI所标识的资源。

  • OPTIONS

请求服务器返回该资源所支持的所有HTTP请求方法。

JS的XMLHttpRequest对象进行 CORS(Cross-origin resource sharing, 跨域资源共享) 时,使用OPTIONS方法发送嗅探请求,以判断是否有对指定资源的访问权限。

例如:

请求:
OPTIONS /upload HTTP/1.1
Access-Control-Request-Method: POST //提醒接下来的请求会使用的方法
Access-Control-Request-Headers: accept, content-type
Origin: http://xxx.com
...

响应头中的关键字:
Access-Control-Allow-Method: POST
Access-Control-Allow-Origin: http://xxx.com //允许的域名
可设置相应状态码为 204 ,告知客户端该响应成功了,但是没有任何响应体。
  • CONNECT

预留,能将连接方式改为管道方式的代理服务器。通常用于SSL加密服务器的链接与非加密的HTTP代理服务器的通信。

  • TRACE

请求服务器回显其收到的请求信息,用于HTTP请求的测试或诊断。

HTTP报文详解

HTTP在应用层交互数据的方式:报文
HTTP的报文分为:请求报文、响应报文

请求报文:

HTTP的请求报文由 请求行、请求头、请求体 组成。

请求方法 URL 协议版本
头部字段名:值
头部字段名:值

请求数据

(换行都rn)
请求行(request line) - 声明 请求方法、主机域名、资源路径、协议版本
请求头(header) - 声明 客户端、服务器报文的部分信息
请求体 - 存放需要发送的数据信息

例如:

GET /index.php/archives/3/ HTTP/1.1
Host: liyunzhen.com   (HTTP/1.0 无host字段)
Connection: keep-alive
Pragma: no-cache
Cache-Control: no-cache

请求Header

请求和响应报文的通用header:

Content-Type - 请求体/响应体的类型,如 text/plain,application/json
Accept - 说明接收的类型,可以多个值,用逗号分开
Content-Length - 请求体/响应体的长度,单位字节
Content-Encoding - 请求体/响应体的编码格式,如gzip、deflate
Accept-Encoding - 告知对方我方接受的Content-Encoding
ETag - 给当前资源的标识,和 Last-Modified、If-None-Match、If-Modified-Since 配合,用于缓存控制
Cache-Control - 取值一般为 no-cache 或 max-age=xx(整数,该资源的缓存有效期,秒)

请求Header:

Authorization - 用于设置身份认证信息
User-Agent - 用户标识,如 OS和浏览器的类型、版本
If-Modified-Since - 值为上一次服务器返回的 Last-Modified 值,用于确认某个资源是否被更改过,没有更改过(304)就从缓存中读取
If-None-Match - 值为上一次服务器返回的 ETag 值,一般和 If-Modified-Since 一起出现
Cookie - 已有的Cookie
Referer - 表示请求引用自那个地址(来源地址)
Host - 请求的主机和端口号

请求体 - 存放需要发送给服务器的数据信息。(可选)

使用方式:

1. 数据交换
 请求体可任意格式类型,需要服务端额外解析。如json格式【protocol buffer 看看是不是】
2. 键值对
 键=值&键=值。如key1=1&key2=2
3. 分部形式
 请求体被分为多个部分,每段以 -{boundary} 、描述头、(空行)、内容,以 -{boundary}- 结束

响应报文

HTTP的响应报文包括:状态行、响应头、响应体

报文结构:

协议版本 状态码 状态描述
头部字段名:值
头部字段名:值

响应正文

状体行 - 声明 协议版本、状态码、状态码描述
响应头 - 声明 客户端、服务端报文的部分信息
响应体 - 存放需要发送的数据信息

例如:

HTTP/1.1 200 OK
Server: openresty
Date: Sun, 12 Aug 2018 02:35:31 GMT
Content-Type: text/html; charset=UTF-8

HTTP状态码

3位十进制数字组成,分为5大类:

1xx - 表示信息通知,如收到了请求正在处理
2xx - 表示成功,如接受或知道了
3xx - 表示重定向,如要完成请求还必须采取进一步行动
4xx - 表示客户端错误,请求包含语法错误或无法实现
5xx - 表示服务器错误

举例:

200 - 请求成功,请求内容与该响应一起返回
202 - 请求已被接受,但还没处理
204 - 请求执行成功,但是没有数据(浏览器不用刷新页面,也不用导向新的页面)
301 - 请求资源已被永久移动到新的位置
302 - 请求的资源被临时移动到新的位置
304 - 服务端资源未发生改变(If Modified Since和资源更新的时间),只返回HEADER
400 - 请求参数有误,当前请求无法被服务器理解
401 - 请求需要验证用户
403 - 不允许访问该地址
404 - Not Found
408 - 请求超时
500 - 服务器内部错误
502 - Bad Gateway 网关出错

协议版本(HTTP/1.0、HTTP/1.1、HTTP/2.0)

HTTP/1.1 特点:
引入持久连接,(在同一个TCP的连接中可传送多个HTTP请求、响应)
多个请求、响应可同时进行、可重叠
引入更多请求头、响应头(身份认证、状态管理、cache缓存、host)

HTTP处理长连接方式:
HTTP/1.1 默认保持长连接,数据传输完成后TCP连接不断开,继续使用该通道传输数据。

建立长连接:

HTTP头部字段:Connection
connection:close - 不使用长连接
connection:Keep-Alive & Keep-Alive:max=20 - 连接失败超过这个次数就断开
connection:Keep-Alive & Keep-Alive:time=20 - 超过该时间则断开

Keep-Alive机制:开启后,TCP层定时发送响应的探针以确定连接的可用性

结束长连接(如何判断本次传输结束)

  1. 判断传输数据是否达到了 Content-Length 指示的大小
  2. 根据 chunked 编码判断,若 chunked 编码的数据在最后有一个空 chunked 块,则表明本次传输完毕

HTTP/2.0特点
支持请求与响应的多路复用,通过压缩HTTP头字段降低开销,增加请求优先级和服务端推送的支持。

多路复用: 允许同时通过单一的HTTP/2.0连接发起多重的请求、响应消息
将HTTP协议通信的基本单位缩小为帧。在应用层和传输层之间增加了一个二进制分帧层。
在二进制分帧层中,HTTP/2.0会将所有传输的消息分割为更小的消息和帧(frame),并采用二进制格式的编码。
服务器推送:当对webServer请求数据时,服务器会顺便把一些客户端需要的资源一起推到客户端,免得客户端再次创建连接请求。适合加载静态资源。

升级配置:

Nginx从1.9版本开始支持HTTP/2.0,编译模块http_v2_module。http2.0协议需要使用https协议

HTTPS

HTTP: 应用层,不加密,80
HTTPS: 传输层,加密,443

这是一份全面& 详细 HTTP知识讲解

HTTP相关协议(一次完整的浏览器请求流程)

在浏览器输入URL回车后,流程:

  1. 域名解析

DNS解析 - 从域名解析到IP地址
搜索浏览器自身的DNS缓存 -- 系统缓存 -- 浏览器向本地配置的首选DNS服务器发起域名解析请求(通过UDP协议向DNS的53端口发起请求,DNS会递归请求,直到拿到IP)

  1. 发起TCP三次握手

拿到域名对应的IP后,浏览器以一个随机端口(1024 < < 65535)向服务器的web程序80端口发起TCP连接请求。

  1. TCP连接后发起http请求
  2. 服务器响应http请求,浏览器得到html代码
  3. 浏览器解析html代码,并请求html代码中的资源(js、css、图片等)
  4. 浏览器对页面进行渲染呈现给用户

加入CDN后的访问过程:

  1. 用户点击URL被cname到CDN服务器的IP(全局负载均衡设备IP)(DNS解析);
  2. 用户向该IP发起内容URL访问请求;
  3. 该全局负载均衡设备根据用户IP请求内容,选择一台用户所属区域负载均衡设备。区域负载均衡设备根据 IP地址(判断服务器距用户最近)、内容、负载等,返回一台缓存服务器的IP地址。
  4. 用户用返回的IP向缓存服务器发起请求。如果该缓存服务器上没有会向上级请求,一直追溯到源服务器。

Cookie与Session

IP地址(IPV4IPV6)

Socket 套接字

一个编程调用接口(API),属于传输层。
一个socket实例唯一代表一个主机上的一个应用程序的通信链路。
成对出现:

Socket = {(IP地址1:PORT端口号),(IP地址2:PORT端口号)}

建立Socket连接过程:
客户端:

1. 创建一个 Socket 实例
2. 操作系统将为该 Socket 实例分配一个未被使用的本地端口号
3. 操作系统创建一个含 本地、远程地址、端口号 的套接字数据结构。(系统一直保留该数据结构到连接关闭)
4. 在创建 Socket 实例的构造函数正确返回前,进行 TCP 的三次握手协议
5. TCP 握手协议完成后,Socket 实例对象将创建完成。(否则抛出 IOException 错误)

服务器:

1. 创建一个 ServerSocket 实例
2. 操作系统为 ServerSocket 实例创建一个底层数据结构。(包含指定监听的端口号、监听地址的通配符[通常是 * ,表示监听所有地址])
3. 调用 accept() 方法时,将进入阻塞状态,等待客户端请求
4. 当一个新的请求到来时,将为该连接创建一个新的套接字数据结构。(包含 请求原地址和端口,关联到 ServerSocket 实例的一个未完成的连接数据结构列表中)
5. 三次握手完成后,该服务端Socket实例才会返回,并且将该 Socket 实例对应的数据结构从未完成列表中移到已完成列表中

相关资料:
Socket使用攻略

Ping与ICMP

time_wait与close_wait

调试工具/方法

相关资源

计算机网络基础


bitsignal
26 声望1 粉丝

呦,写bug呐